package com.lw.jdbc.utils;

import com.lw.jdbc.domain.User;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/*
*    JDBC :JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API，可以为多种关系数据库提供统一访问，
* 它由一组用Java语言编写的类和接口组成.
*     JDBC的基本原理 ：
*      1.加载驱动程序
*      2.通过DriverManager的getConnection()方法获取数据库连接
*      3.通过Connection对象的createStatement()方法创建PerparedStatement对象
*      4.通过PerparedStatement对象的executeQuery()方法执行SQL语句（SELECT），获取查询结果集
*        通过PerparedStatement对象的executeUpdate()方法执行SQL语句（INSERT UPDATE，DELETE） ，获取增删改
*      5.通过ResultSetMetaData对象获取结果集的元数据
*      6.通过ResultSet对象的getXXX()方法获取数据
*      7.关闭数据库连接
*
*
*
*
* */

public class JDBCUtils {
    // JDBC 驱动名及数据库 URL
     private static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";   //mysql的驱动
     static final String DB_URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";

    // 数据库的用户名与密码，需要根据自己的设置
    static final String USER = "root";
    static final String PASS = "123";


    // 静态代码块负责加载驱动
    static {
        try {
            Class.forName(JDBC_DRIVER);     ///注册驱动
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    // 获取数据库连接
    public static Connection getConnection() throws java.sql.SQLException {

        return DriverManager.getConnection(DB_URL,USER,PASS);    ///获取数据库连接。
    }

    // 释放资源
    public static void release(Connection conn, Statement stmt, ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public static List<User> getList(ResultSet resultSet)  {
         List<User> list = new ArrayList<User>(); //创建一个集合
        //1  遍历ResultSet
         try {
             while(resultSet.next()){
                 String username = resultSet.getString("username");    //获 取username
                 String password = resultSet.getString("password");    //获 取password
                 String addrs = resultSet.getString("adress");          //获 取addrs
                 Integer id = resultSet.getInt("id");                   //获 取id
                 User user= new User();
                 user.setId(id);
                 user.setUsername(username);
                 user.setPassword(password);
                 user.setAdress(addrs);
                 list.add(user);

             }

         }catch (SQLException e){
             e.printStackTrace();  //打印异常
         }
         return list;

    }

    public static<T> List<T> getList(ResultSet resultSet , Class<T> c) throws SQLException {
         List<T> list = new ArrayList<T>();
            try {
                while (resultSet.next()) {
                    T t = c.newInstance();
                    Field[] fields = c.getDeclaredFields();
                    for (Field field : fields) {
                        field.setAccessible(true);
                        String name = field.getName();
                        String type = field.getType().getSimpleName();
                        if ("int".equals(type)) {
                            field.set(t, resultSet.getInt(name));
                        } else if ("String".equals(type)) {
                            field.set(t, resultSet.getString(name));
                        } else if ("Date".equals(type)) {
                            field.set(t, resultSet.getDate(name));
                        }
                    }
                    list.add(t);
                }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return list;
    }
}

